package com.greenyoung.pwiki.elasticsearch.search.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import com.greenyoung.pwiki.common.consts.ConstElIndex;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;

/**
 * 由于我使用的是spring data elasticsearch 3.2.5，暂未支持el 7.0以上，所以它还是有doc类型的
 * 而el7.0之上的默认doc类型为_doc，这里如果不指定类型，那么它就没有类型
 * 为了统一操作，所有类型都指定为_doc
 * <p>
 * 启动时不自动创建索引，以防覆盖掉以存在索引的数据
 */
@Data
//@Document(indexName = ConstIndex.MARKDOWN_INDEX, createIndex = false, shards = 4, type = "_doc")
@Document(indexName = ConstElIndex.MARKDOWN_INDEX, shards = 4, type = "_doc")
public class Markdown {
    /**
     * 唯一id，来自oss_file中的id
     */
    @Id
    private Long id;

    /**
     * 用原始文件名代替，可由用户修改
     */
    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private String name;

    /**
     * 文件的URL地址，当文章更新时删除原地址，更新新地址，同时更新oss_file中的地址',
     * 不对其进行索引，因为没有检索这个字段的需求
     */
    @Field(index = false, type = FieldType.Keyword)
    private String url;

    /**
     * 作者
     */
    @Field(type = FieldType.Keyword)
    private String author;

    /**
     * 是否原创
     */
    @Field(name = "is_original", type = FieldType.Boolean)
    private Boolean isOriginal;

    /**
     * 文章实际的创作时间，而非上传时间',
     */
    @Field(name = "create_time", type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 上次修改时间，如果没有修改，则为创作时间',
     */
//    @Field(name = "last_modified", type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis")
//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
//    private Date lastModified;


    @Field(type = FieldType.Object)
    Attachment attachment;

    /**
     * 用于存储高亮检索结果
     * <p>
     * 例如：
     * "highlight": {
     * "attachment.content": [
     * "有个<em>学长</em>从11月份开始复习，最后数学才考了五十多分，我不是说他是个low b，我是说数学性价比很低，而我这么搞下去，最终也只是个low b。",
     * "大一刚来的时候更是迷茫又自闭，跟一群<em>学长</em>住一起，没有朋友，成天不知道该干些什么。不过还好，也不算太废，还是摸索出了一条属于自己的道路，虽然还是有些自闭，但是已经在往好的方向发展了。"
     * ]
     */
    private List<String> searchHighlightContent;
}
